/**
  * Author: Mei
  * Date: 2020-10-16 17:15
  * Description: 
  *
  */
#include <iostream>

using namespace std;

class A {
public:
    virtual void display() {
        cout << "A" << endl;
    }

};

class B : public A {
public:
    virtual void display() {
        cout << "B" << endl;
    }
};

class Point {
public:
    Point() {
    }

    virtual ~Point() {
        cout << "executing Point destructor" << endl;
    }
};

class Circle : public Point {
public:
    Circle() {

    }

    ~Circle() {
        cout << "executing Circle destructor" << endl;
    }

private:
    int radius;
};

int main() {
    //B b;
    //A a;
    //a = b;
    //a.display();
    //通过对象名去调用虚函数是不会产生多态的


    /**
     * 虚函数使用方法
     * 1.在基类用virtual声明成员函数为虚函数
     * 2.在类外定义虚函数时，以后不再加virtual
     * 3.效果：完成函数覆盖提高了函数的可扩充性
     *          成员函数被声明为虚函数后，其以后的派生类中函数覆盖的同名函数自动成为虚函数
     *          也可以在派生类中不定义虚函数，则派生类简单地继承其直接基类的虚函数
     *
     *
     */
    //Circle c;
    Point *p = new Circle;
    delete p;
    /**
     * 虚析构函数
     * 一般先调用派生类的析构函数 然后再调用基类的析构函数
     *
     * 如果将基类的析构函数声明为虚函数时，由该基类所派生的所有派生类的析构函数也都自动成为虚函数，
     * 即时派生类的析构函数与基类的析构函数名字不相同
     *
     * 最好把基类的析构函数声明为虚函数
     */

    /**
     * 抽象类
     * 1、凡是包含纯虚函数的类都是抽象类
     *      纯虚函数不用实现，故不能被调用，抽象类无法建立对象
     *      主要是为类提供一个公共接口
     * 2、如果在抽象类所派生出的新类对基类的所有纯虚函数进行了定义
     *      那么这些函数就被赋予了具体的功能，可以被调用
     *      这个派生类就不是抽象类，而是可以用来定义对象的具体类
     * 3、如果在派生类中没有对所有纯虚函数进行定义，则此派生类仍然是抽象类，不能用来定义对象
     *
     */

    /**
     * 设计模式
     *
     *
     */

    return 0;
}